Elasticsearch QueryString 查詢語法筆記
TLDR
query_string是基於 Lucene 的查詢語法,適合快速檢索。- 預設運算子為
OR,多詞彙搜尋時若欄位為keyword型別,須加雙引號或使用OR連接。 - 比較運算子(
>、<等)不支援fields陣列參數,建議統一使用範圍查詢語法[x TO y]。 - 日期查詢不支援比較運算子,且標準格式(含
:)必須使用雙引號包覆。 - 模糊搜尋
~與近似搜尋~N必須搭配fuzziness或phrase_slop參數,且查詢字串中的設定優先於 API 參數。 - 欄位加權
^影響欄位間的相對分數,查詢boost影響複合查詢中子句的相對重要性。
基本語法與 API 結構
query_string 是 Elasticsearch 中基於 Lucene 查詢語法的擴展,適合在 Elasticvue 或 Kibana Discover 等介面進行快速全文檢索。
基本 API 結構
json
{
"query": {
"query_string": {
"query": "your query string here",
"default_field": "content",
"default_operator": "OR"
}
},
"size": 10,
"from": 0,
"sort": []
}查詢語法行為差異
不同欄位類型的搜尋行為
什麼情況下會遇到搜尋不到資料的問題?當針對 keyword 或數值欄位進行多詞彙搜尋時,若未正確使用雙引號或運算子,會因無法分詞而導致搜尋失敗。
| 欄位類型 | 查詢字串 | 行為說明 |
|---|---|---|
| text | apple banana | 等同 apple OR banana,找到任一詞彙即符合 |
| keyword | "apple" "banana" | 必須用雙引號明確搜尋多個完整字串,或使用 OR |
| 數值/日期 | 123 456 | 查不到,因為 query_string 不會自動拆分多個完整值 |
範圍查詢與比較運算子
比較運算子限制
什麼情況下會遇到查詢錯誤?在 query_string 中使用 fields 陣列參數搭配比較運算子(如 >、>=)會導致解析失敗。
- 建議做法:改用範圍查詢語法
[x TO y],此語法與fields參數完全相容。
json
// ❌ 錯誤寫法:使用 fields 陣列會導致查詢失敗
{
"query": {
"query_string": {
"query": ">=10",
"fields": ["price"]
}
}
}
// ✅ 正確做法:使用範圍查詢語法
{
"query": {
"query_string": {
"query": "[10 TO *]",
"fields": ["price"]
}
}
}日期時間查詢
日期查詢注意事項
什麼情況下會遇到日期查詢失效?當使用比較運算子查詢日期,或日期格式包含冒號(:)卻未加雙引號時。
- 標準格式需加雙引號:因
:為特殊字元,如timestamp:"2023-01-15T08:30:00Z"。 - 不支援比較運算子:日期欄位不支援
>或<,請務必使用[start TO end]範圍語法。 - 格式嚴謹性:若欄位定義了特定
format,查詢字串必須完全符合該格式,否則會發生failed to parse date field錯誤。
權重控制:Boost 與欄位加權
欄位加權 (Field Boost)
使用 ^ 語法調整特定欄位權重,適用於多欄位搜尋時,強調標題(Title)比內容(Content)更具代表性的場景。
json
{
"query_string": {
"query": "apple iphone",
"fields": ["title^3", "content"]
}
}查詢層級 Boost (Query Boost)
在 bool 複合查詢中,調整整個查詢子句的重要性。注意:若單獨使用一個查詢,boost 不會改變排序結果。
模糊搜尋與近似搜尋
模糊與近似語法
什麼情況下會遇到參數設定無效?當查詢字串中未包含 ~ 符號時,全域的 fuzziness 或 phrase_slop 參數將不會生效。
- 模糊搜尋 (
~):用於單詞後,處理拼寫錯誤。 - 近似搜尋 (
~N):用於引號包圍的片語後,處理詞彙順序與距離(Slop)。
優先順序規則:
- 查詢字串中的
~N(明確數字)優先級最高。 - 查詢字串中的
~(無數字)搭配 API 參數。 - 若無
~,則視為精確匹配,參數設定無效。
異動歷程
- 初版文件建立。
- 修正語句用詞,統一使用台灣慣用語。
- 修正日期查詢範圍語法說明(日期欄位不支援比較運算子,應使用範圍查詢語法)。
- 修正權重計算遺漏欄位基礎分數的部分。
- 補充技術細節。